123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- "use client";
- import Sidebar from "@/components/Layout/Sidebar";
- import Loading from "@/components/Loading";
- import { useSystemStore } from "@/stores/useSystemStore";
- import { setHtmlFontSize } from "@/utils";
- import { ConfigProvider, Dialog } from "antd-mobile";
- import enUS from "antd-mobile/es/locales/en-US";
- import { useLocale } from "next-intl";
- import { ThemeProviderProps } from "next-themes/dist/types";
- import { ReactNode, useLayoutEffect, useRef } from "react";
- import { Swiper, SwiperClass, SwiperSlide } from "swiper/react";
- import { useDebounceEffect } from "ahooks";
- import { initializeApp } from "firebase/app";
- import { getMessaging, getToken, onMessage } from "firebase/messaging";
- export interface ProvidersProps {
- children: ReactNode;
- themeProps?: Omit<ThemeProviderProps, "children">;
- }
- const initFirebase = () => {
- // 是否是https
- if (document.location.protocol.indexOf("https") === -1) return;
- // 浏览器是否支持 且是 pwa
- if (!window.Notification) {
- Dialog.alert({
- getContainer: null,
- bodyStyle: { background: "#fff" },
- title: "提示",
- confirmText: "我知道了",
- content: (
- <>
- <div className={"text-center"}>
- <p>当前版本浏览器不支持通知</p>
- <p>请更换或升级浏览器获得更好使用体验</p>
- </div>
- </>
- ),
- });
- return;
- }
- // 是否开启通知
- // new Notification("这是标题", {
- // body: "这是正文",
- // icon: "https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png",
- // requireInteraction: true,
- // image: "https://gw.alipayobjects.com/zos/rmsportal/JiqGstEfoWAOHiTxclqi.png",
- // });
- if (Notification.permission === "default") {
- // 征求用户的许可
- Notification.requestPermission();
- }
- if (Notification.permission === "denied") return;
- const app = initializeApp({
- apiKey: process.env.NEXT_PUBLIC_FIREBASE_APIKEY,
- authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTHDOMAIN,
- projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECTID,
- storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGEBUCKET,
- messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGINGSENDERID,
- appId: process.env.NEXT_PUBLIC_FIREBASE_APPID,
- measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENTID,
- });
- const messaging = getMessaging(app);
- // 针对单机测试,或者服务端需要使用这个key可以放开
- // if (process.env.NODE_ENV === "development") {
- getToken(messaging, {
- vapidKey: process.env.NEXT_PUBLIC_FIREBASE_KEYS,
- }).then((res) => {
- console.log(`🚀🚀🚀🚀🚀-> `, res);
- });
- // }
- onMessage(messaging, (payload) => {
- const notifica = new Notification(payload.data?.title || "", {
- body: payload.data?.body,
- icon: payload.data?.image,
- ...payload.data,
- });
- });
- };
- const Layout = ({ children, themeProps }: ProvidersProps) => {
- const { isCollapse, setCollapse } = useSystemStore((state) => ({
- isCollapse: state.isCollapse,
- setCollapse: state.setCollapse,
- }));
- const local = useLocale();
- const swiperRef = useRef<SwiperClass>();
- const homeContainerRef = useRef<HTMLDivElement>(null);
- const startHandler = () => {
- homeContainerRef.current?.classList.add("containerMask");
- setCollapse(true);
- };
- const endHandler = () => {
- homeContainerRef.current?.classList.remove("containerMask");
- setCollapse(false);
- };
- useLayoutEffect(() => {
- // 调用响应式方法
- setHtmlFontSize();
- }, []);
- return (
- <div id="app" className="bg-black">
- <Swiper
- resistanceRatio={10}
- initialSlide={2}
- slidesPerView={"auto"}
- onSlidePrevTransitionStart={startHandler}
- onSlideNextTransitionEnd={endHandler}
- slideToClickedSlide
- onSwiper={(swiper) => {
- swiperRef.current = swiper;
- }}
- allowTouchMove={false}
- >
- <SwiperSlide>
- <section className="relative flex h-[100vh] items-center justify-center">
- <Loading />
- </section>
- </SwiperSlide>
- <SwiperSlide style={{ width: "70%" }} className={"bg-[rgb(31,31,31)]"}>
- <section className="relative h-[100vh]">{<Sidebar></Sidebar>}</section>
- </SwiperSlide>
- <SwiperSlide style={{ width: "100%" }}>
- <section className="relative h-[100%]" ref={homeContainerRef}>
- {children}
- </section>
- </SwiperSlide>
- </Swiper>
- </div>
- );
- };
- export const Providers = ({ children, themeProps }: ProvidersProps) => {
- useDebounceEffect(() => {
- if ("serviceWorker" in navigator) {
- initFirebase();
- }
- }, []);
- return (
- <ConfigProvider locale={enUS}>
- <Layout>{children}</Layout>
- </ConfigProvider>
- );
- };
|